using System.Text.Json;
using System.Text.Json.Serialization;

namespace LDNS.SDK.Utilities
{
    /// <summary>
    /// JSON工具类：提供统一的JSON序列化和反序列化功能
    /// 作者：huobing
    /// </summary>
    public static class JsonUtils
    {
        /// <summary>
        /// 获取默认的JsonSerializerOptions配置
        /// </summary>
        public static JsonSerializerOptions DefaultOptions {
            get {
                var options = new JsonSerializerOptions
                {
                    WriteIndented = false,
                    PropertyNameCaseInsensitive = true
                };
                
                // 针对不同.NET版本使用不同的方式处理null值序列化
                // 在较新的.NET版本中，IgnoreNullValues已过时，应使用DefaultIgnoreCondition
                try
                {
                    // 尝试使用新的DefaultIgnoreCondition属性
                    // 注意：这需要引用System.Text.Json.Serialization命名空间
                    typeof(JsonSerializerOptions).GetProperty("DefaultIgnoreCondition")?
                        .SetValue(options, JsonIgnoreCondition.WhenWritingNull);
                }
                catch (Exception)
                {
                    // 如果设置新属性失败，则使用旧的IgnoreNullValues属性（针对旧版本.NET）
                    typeof(JsonSerializerOptions).GetProperty("IgnoreNullValues")?
                        .SetValue(options, true);
                }
                
                return options;
            }
        }
        
        /// <summary>
        /// 将对象序列化为JSON字符串，自动使用对象的实际类型
        /// 确保多态对象的子类特有属性也能被正确序列化
        /// </summary>
        /// <param name="obj">要序列化的对象</param>
        /// <param name="options">序列化选项，可选</param>
        /// <returns>序列化后的JSON字符串</returns>
        public static string Serialize(object obj, JsonSerializerOptions? options = null)
        {
            if (obj == null)
            {
                return "null";
            }
            
            // 使用对象的实际类型进行序列化，而不是声明类型
            // 这样可以确保子类的特有属性也被正确序列化
            return JsonSerializer.Serialize(obj, obj.GetType(), options ?? DefaultOptions);
        }
        
        /// <summary>
        /// 将JSON字符串反序列化为指定类型的对象
        /// </summary>
        /// <typeparam name="T">目标类型</typeparam>
        /// <param name="json">JSON字符串</param>
        /// <param name="options">序列化选项，可选</param>
        /// <returns>反序列化后的对象</returns>
        public static T? Deserialize<T>(string json, JsonSerializerOptions? options = null)
        {
            return JsonSerializer.Deserialize<T>(json, options ?? DefaultOptions);
        }
        
        /// <summary>
        /// 将JSON字符串反序列化为指定类型的对象
        /// </summary>
        /// <param name="json">JSON字符串</param>
        /// <param name="returnType">目标类型</param>
        /// <param name="options">序列化选项，可选</param>
        /// <returns>反序列化后的对象</returns>
        public static object? Deserialize(string json, System.Type returnType, JsonSerializerOptions? options = null)
        {
            return JsonSerializer.Deserialize(json, returnType, options ?? DefaultOptions);
        }
    }
}